package com.share.netdisk.reclaim.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.share.netdisk.config.HdfsConfig;
import com.share.netdisk.garbage.dao.GarbageDao;
import com.share.netdisk.reclaim.dao.ReclaimDao;
import com.share.netdisk.reclaim.model.Reclaim;
import com.share.netdisk.userhomefile.dao.UserHomeFileDao;
import com.share.netdisk.userhomefile.model.UserHomeFile;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;

@Service
public class ReclaimServiceImpl extends ServiceImpl<ReclaimDao, Reclaim> implements ReclaimService{

	@Autowired
	private HdfsConfig hdfsConfig;//hdfs路径

	@Autowired
	private ReclaimDao reclaimDao;//回收站表

	@Autowired
	private GarbageDao garbageDao;//文件表

	@Autowired
	private UserHomeFileDao userHomeFileDao;

	//搜索展示回收站的文件，只展示状态为1的回收站的文件
	@Override
	public Page<Reclaim> getFilesByUserId(Integer userId, String keyword, Integer pageNum, Integer pageSize) {
		// 创建分页对象
		Page<Reclaim> page = new Page<>(pageNum, pageSize);

		// 查询条件：根据用户ID和状态过滤
		QueryWrapper<Reclaim> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("home_file_id", userId)
				.eq("reclaim_status", 1); // 仅展示 reclaim_status 为 1 的记录

		// 如果关键字不为空，则添加模糊搜索条件
		if (keyword != null && !keyword.trim().isEmpty()) {
			queryWrapper.and(wrapper -> wrapper.like("reclaim_id", keyword));
		}

		// 执行分页查询
		return this.page(page, queryWrapper);
	}


	/**
	 * 逻辑删除回收站表中文件
	 * 1.首先更新reclaim表中的状态为0
	 * 2.其次删除file表中的文件
	 * 3.最后根据文件id从user_home_file表中获取到recycle_url把文件删除掉。
	 */
	@Override
	@Transactional
	public boolean permanentlyDeleteReclaims(List<Integer> reclaimIds) {
		// 查询回收站记录
		List<Reclaim> reclaims = reclaimDao.selectBatchIds(reclaimIds);

		if (reclaims.isEmpty()) {
			System.err.println("未找到任何回收站记录，ID：" + reclaimIds);
			return false; // 如果没有找到任何记录，直接返回
		}

		FileSystem fs = null;
		int successCount = 0; // 成功更新状态的记录数
		List<Integer> notFoundIds = new java.util.ArrayList<>(reclaimIds); // 未找到的记录ID

		try {
			// 获取 HDFS 文件系统
			fs = hdfsConfig.fileSystem();

			for (Reclaim reclaim : reclaims) {
				Integer fileId = reclaim.getFileId();
				// 查询 user_home_file 表获取文件路径
				UserHomeFile userHomeFile = userHomeFileDao.selectById(fileId);

				if (userHomeFile != null) {
					notFoundIds.remove(reclaim.getReclaimId()); // 移除已找到的ID

					String recycleUrl = userHomeFile.getReclaimUrl();
					Path path = new Path(recycleUrl);

					try {
						// 检查文件是否存在
						if (fs.exists(path)) {
							// 删除 HDFS 文件
							boolean deleteResult = fs.delete(path, true);
							if (deleteResult) {
								System.out.println("文件已删除: " + recycleUrl);
							} else {
								System.err.println("文件删除失败: " + recycleUrl);
							}
						} else {
							System.out.println("文件已不存在: " + recycleUrl);
						}

						// 更新 reclaim 表中的状态
						reclaim.setReclaimStatus(0);
						boolean updateResult = this.updateById(reclaim);

						if (updateResult) {
							successCount++;
							System.out.println("回收站记录已更新为删除状态，ID：" + reclaim.getReclaimId());
						} else {
							System.err.println("回收站记录更新失败，ID：" + reclaim.getReclaimId());
						}

						// 删除file表中的记录
						garbageDao.deleteById(fileId);
					} catch (IOException e) {
						System.err.println("文件操作失败，路径：" + recycleUrl + "，错误：" + e.getMessage());
					}
				} else {
					System.err.println("未找到文件记录，文件ID：" + fileId);
				}
			}
		} catch (IOException | URISyntaxException | InterruptedException e) {
			// 捕获异常并回滚事务
			throw new RuntimeException("HDFS操作失败", e);
		} finally {
			if (fs != null) {
				try {
					fs.close();
				} catch (IOException e) {
					System.err.println("关闭HDFS文件系统失败：" + e.getMessage());
				}
			}
		}

		// 打印未找到的记录
		if (!notFoundIds.isEmpty()) {
			System.err.println("以下ID未找到回收站记录：" + notFoundIds);
		}

		// 返回是否有成功操作的记录
		return successCount > 0;
	}


}
